home *** CD-ROM | disk | FTP | other *** search
- (*----------------------------------------------------------------------*)
- (* Initialize_Receive_Display --- Set up display of Kermit reception *)
- (*----------------------------------------------------------------------*)
-
- PROCEDURE Initialize_Receive_Display;
-
- BEGIN (* Initialize_Receive_Display *)
-
- GoToXY( 1 , 1 );
-
- WRITE(' Packets received :');
- ClrEol;
-
- GoToXY( 1 , 2 );
- WRITE(' Bytes received :');
- ClrEol;
-
- GoToXY( 1 , 3 );
- WRITE(' Retries :');
- ClrEol;
-
- GoToXY( 1 , 5 );
- WRITE(' Last status message :');
- ClrEol;
-
- END (* Initialize_Receive_Display *);
-
- (*----------------------------------------------------------------------*)
- (* Kermit_Receive_Header --- get file header packet for Kermit *)
- (*----------------------------------------------------------------------*)
-
- PROCEDURE Kermit_Receive_Header;
-
- (*----------------------------------------------------------------------*)
- (* *)
- (* Procedure: Kermit_Receive_Header *)
- (* *)
- (* Purpose: Get file header packet for Kermit *)
- (* *)
- (* Calling Sequence: *)
- (* *)
- (* Kermit_Receive_Header; *)
- (* *)
- (* Remarks: *)
- (* *)
- (* This procedure receives packets and looks for the file header *)
- (* packet. If a good file header packet is found, this routine *)
- (* tries to open the file. If the file opens successfully, the *)
- (* state changes to 'Receive_File'. If the file cannot be *)
- (* opened (the file open procedure attempts to create a unique *)
- (* filename if the specified file already exists) an error *)
- (* packet is returned to the requesting kermit. This procedure *)
- (* also handles 'Send Init' and 'Break' packets as specified in *)
- (* the Kermit Protocol Manual. *)
- (* *)
- (*----------------------------------------------------------------------*)
-
- VAR
- Try : INTEGER;
- Get_Pack : BOOLEAN;
-
- BEGIN (* Kermit_Receive_Header *)
- (* If we alerady have header, use it *)
-
- Get_Pack := ( Kermit_Packet_Type <> Header_Pack );
-
- REPEAT (* Get a packet *)
-
- IF Get_Pack THEN
- Receive_Packet
- ELSE
- Get_Pack := TRUE;
- (* If recognized, perform required *)
- (* function based upon packet type *)
- IF Packet_OK THEN
-
- CASE Kermit_Packet_Type OF
-
- Header_Pack : BEGIN
- (* Try opening file *)
-
- Open_File( Write_Open,
- Fix_File_Name( Rec_Packet ) );
-
- (* If OK, then shift to receive state *)
-
- IF Open_OK THEN
- BEGIN
- Buffer_Pos := 0;
- Packet_Num := Rec_Packet_Num;
- Display_Kermit_Message('Receiving ' +
- Rec_Packet );
- Send_ACK;
- Kermit_State := Receive_File;
- END
-
- (* Not ok open -- send error packet *)
- (* to remote Kermit. *)
- ELSE
- BEGIN
- Packet_Buffer := 'ECannot open file';
- Build_Packet;
- Send_Packet;
- Kermit_Abort := TRUE;
- Display_Kermit_Message( 'Cannot open file: '
- + Rec_Packet );
- END;
-
- END;
-
- Send_Pack : BEGIN
- Packet_Num := Rec_Packet_Num;
- Send_ACK;
- END;
-
- Break_Pack : BEGIN
- Packet_Num := Rec_Packet_Num;
- Send_ACK;
- Receive_Done := TRUE;
- Display_Kermit_Message('Completed.');
- END;
-
- End_Pack : BEGIN
- Packet_Num := Rec_Packet_Num;
- Send_ACK;
- END;
-
- Unknown : BEGIN
- Kermit_Abort := TRUE;
- Packet_Num := Rec_Packet_Num;
- Packet_Buffer := 'EUnknown packet type.';
- Build_Packet;
- Send_Packet;
- Display_Kermit_Message('Abort -- unknown packet type.');
- END;
-
- END (* CASE *)
-
- ELSE
-
- BEGIN
- Try := Try + 1;
- Packets_Bad := Packets_Bad + 1;
- Send_NAK;
- IF ( Try = Kermit_MaxTry ) THEN
- BEGIN
- Kermit_Abort := TRUE;
- Packet_Num := 0;
- Packet_Buffer := 'ECannot get file header.';
- Build_Packet;
- Send_Packet;
- Display_Kermit_Message('Cannot get file header.');
- END;
- END;
-
- UNTIL Kermit_Abort OR ( Kermit_State = Receive_File ) OR Receive_Done;
-
- END (* Kermit_Receive_Header *);
-
- (*----------------------------------------------------------------------*)
- (* Kermit_Get --- Initiate server mode receive for Kermit *)
- (*----------------------------------------------------------------------*)
-
- PROCEDURE Kermit_Get;
-
- (*----------------------------------------------------------------------*)
- (* *)
- (* Procedure: Kermit_Get *)
- (* *)
- (* Purpose: Initiate server mode receive for Kermit *)
- (* *)
- (* Calling Sequence: *)
- (* *)
- (* Kermit_Get; *)
- (* *)
- (* Remarks: *)
- (* *)
- (* This procedure attempts to initiate a server receive. *)
- (* First, Kermit_Get sends an 'R' packet with the selected *)
- (* file name. If a valid 'Send Init' packet is received, then *)
- (* the Kermit state is changed to Receive_Header. If a valid *)
- (* 'Send Init' is NOT received, then an error packet is sent to *)
- (* the other Kermit after the specified number of retries. *)
- (* *)
- (*----------------------------------------------------------------------*)
-
- VAR
- Try : INTEGER;
- Init_OK : BOOLEAN;
-
- BEGIN (* Kermit_Get *)
- (* Send 'Get File' packet *)
- Packet_Num := 0;
- Packet_Buffer_Data := 'R' + FileName;
-
- Build_Packet;
-
- Try := 0;
-
- REPEAT
-
- Send_Packet;
- Receive_Packet;
-
- IF Packet_OK AND ( Kermit_Packet_Type = Send_Pack ) THEN
- BEGIN
-
- Packet_Num := Rec_Packet_Num;
-
- Check_Init( Init_OK );
-
- IF Init_OK THEN
- BEGIN
- Send_ACK;
- Kermit_State := Receive_Header;
- END;
-
- END;
-
- IF ( Kermit_Packet_Type = Error_Pack ) THEN
- BEGIN
- Display_Kermit_Message( Rec_Packet );
- Kermit_Abort := TRUE;
- END;
-
- IF NOT ( Init_OK OR Kermit_Abort ) THEN
- BEGIN
- Packets_Bad := Packets_Bad + 1;
- Try := Try + 1;
- Send_NAK;
- END;
-
- IF ( ( Try = Kermit_MaxTry ) OR Kermit_Abort ) THEN
- BEGIN
- Kermit_Abort := TRUE;
- Packet_Buffer_Data := 'ECannot get send init packet';
- Build_Packet;
- Send_Packet;
- Display_Kermit_Message('Cannot get send_init packet.');
- END;
-
- UNTIL Kermit_Abort OR ( Kermit_State = Receive_Header );
-
- END (* Kermit_Get *);
-
- (*----------------------------------------------------------------------*)
- (* Kermit_Receive_Init --- get Send Init packet for Kermit receives *)
- (*----------------------------------------------------------------------*)
-
- PROCEDURE Kermit_Receive_Init;
-
- (*----------------------------------------------------------------------*)
- (* *)
- (* Procedure: Kermit_Receive_Init *)
- (* *)
- (* Purpose: get 'Send Init' for Kermit receives *)
- (* *)
- (* Calling Sequence: *)
- (* *)
- (* Kermit_Receive_Init; *)
- (* *)
- (* Remarks: *)
- (* *)
- (* This procedure waits for a 'Send Init' packet; it will hang *)
- (* here UNTIL a valid 'Send Init' packet is received, or an *)
- (* Alt-R is entered at the keyboard to abort the transfer. *)
- (* *)
- (*----------------------------------------------------------------------*)
-
- VAR
- Try : INTEGER;
- Init_OK : BOOLEAN;
- Save_CHK: CHAR;
-
- BEGIN (* Kermit_Receive_Init *)
- (* Initialize display *)
- Initialize_Receive_Display;
-
- Try := 0;
-
- REPEAT
- (* Init packet always has block *)
- (* check type one. *)
-
- Save_CHK := His_Chk_Type;
- His_Chk_Type := '1';
-
- Receive_Packet;
-
- His_Chk_Type := Save_CHK;
-
- IF Packet_OK AND ( Kermit_Packet_Type = Send_Pack ) THEN
- BEGIN
-
- Packet_Num := Rec_Packet_Num;
-
- Check_Init( Init_OK );
-
- IF Init_OK THEN
- BEGIN
- Send_ACK;
- Kermit_State := Receive_Header;
- END
- ELSE
- BEGIN
-
- Packets_Bad := Packets_Bad + 1;
-
- Send_NAK;
-
- Try := Try + 1;
-
- IF ( Try = Kermit_MaxTry ) THEN
- BEGIN
- Kermit_Abort := TRUE;
- Packet_Buffer_Data := 'ECannot get send init packet';
- Build_Packet;
- Send_Packet;
- GoToXY(1,9);
- WRITELN('Cannot get send_init packet.');
- END;
-
- END;
-
- END;
-
- UNTIL Kermit_Abort OR ( Kermit_State = Receive_Header );
-
- END (* Kermit_Receive_Init *);
-
- (*----------------------------------------------------------------------*)
- (* Expand_Packet --- Expand data in Kermit packet *)
- (*----------------------------------------------------------------------*)
-
- PROCEDURE Expand_Packet;
-
- (*----------------------------------------------------------------------*)
- (* *)
- (* Procedure: Expand_Packet *)
- (* *)
- (* Purpose: Expands data in Kermit packet *)
- (* *)
- (* Calling Sequence: *)
- (* *)
- (* Expand_Packet; *)
- (* *)
- (*----------------------------------------------------------------------*)
-
- VAR
- InPos : INTEGER;
- Q8Bit : BOOLEAN;
- Temp : CHAR;
- B_Temp : BYTE ABSOLUTE Temp;
-
- BEGIN (* Expand_Packet *)
-
- Received_Data := '';
- InPos := 1;
-
- WHILE ( InPos <= LENGTH( Rec_Packet ) ) DO
- BEGIN
- (* Get next character in packet *)
-
- Temp := Rec_Packet[ InPos ];
-
- (* Check for 8-bit quote character *)
-
- IF ( Temp = His_Quote_8_Char ) AND Quoting THEN
- BEGIN
- Q8Bit := TRUE;
- InPos := InPos + 1;
- Temp := Rec_Packet[ InPos ];
- END
- ELSE
- Q8Bit := FALSE;
- (* Check for control quote character *)
-
- IF ( Temp = His_Quote_Char ) THEN
- BEGIN
-
- InPos := InPos + 1;
- Temp := Rec_Packet[ InPos ];
-
- (* Convert to control character EXCEPT *)
- (* for 8-bit quote character or control *)
- (* quote character. *)
-
- IF ( CHR( B_Temp AND $7F ) <> His_Quote_Char ) AND
- ( NOT ( Quoting AND ( Temp = His_Quote_8_Char ) ) ) THEN
- B_Temp := B_Temp XOR 64;
-
- END;
- (* Turn on 8th bit if required *)
- IF Q8Bit THEN
- B_Temp := B_Temp OR $80;
-
- (* Append character to result string *)
-
- Received_Data := Received_Data + Temp;
-
- (* Point to next character *)
- InPos := InPos + 1;
-
- END (* WHILE *);
-
- END (* Expand_Packet *);
-
- (*----------------------------------------------------------------------*)
- (* Kermit_Receive_File --- get file data from remote Kermit *)
- (*----------------------------------------------------------------------*)
-
- PROCEDURE Kermit_Receive_File;
-
- (*----------------------------------------------------------------------*)
- (* *)
- (* Procedure: Kermit_Receive_File *)
- (* *)
- (* Purpose: Gets file data from remote Kermit *)
- (* *)
- (* Calling Sequence: *)
- (* *)
- (* Kermit_Receive_File; *)
- (* *)
- (* Remarks: *)
- (* *)
- (* This procedure receives file data from the remote Kermit *)
- (* until a Break packet, and End packet, or an Unknown packet *)
- (* is received. It will also abort if there are too many *)
- (* retries. *)
- (* *)
- (*----------------------------------------------------------------------*)
-
- VAR
- Count : INTEGER;
- Try : INTEGER;
-
- (*----------------------------------------------------------------------*)
- (* Handle_Data_Pack --- handle one data packet *)
- (*----------------------------------------------------------------------*)
-
- PROCEDURE Handle_Data_Pack;
-
- VAR
- Err : INTEGER;
- Write_Count : INTEGER;
-
- BEGIN (* Handle_Data_Pack *)
- (* Expand data packet -- do quoting, *)
- (* repeats, etc. *)
- Expand_Packet;
- (* Stuff data into output file buffer *)
-
- FOR Count := 1 TO LENGTH( Received_Data ) DO
- BEGIN
-
- IF ( Buffer_Pos >= Buffer_Size ) THEN
- BEGIN
-
- Write_Count := Buffer_Size;
- Err := Write_File_Handle( XFile_Handle, Write_Buffer^,
- Write_Count );
- Buffer_Pos := 0;
-
- END;
-
- Buffer_Pos := Buffer_Pos + 1;
- Write_Buffer^[Buffer_Pos] := ORD( Received_Data[Count] );
-
- END;
- (* Increment received bytes count *)
-
- Buffer_Num := Buffer_Num + LENGTH( Received_Data );
-
- (* Acknowledge this packet *)
- Send_ACK;
-
- END (* Handle_Data_Pack *);
-
- (*----------------------------------------------------------------------*)
- (* Handle_End_Pack --- handle end of file packet *)
- (*----------------------------------------------------------------------*)
-
- PROCEDURE Handle_End_Pack;
-
- VAR
- Write_Count : INTEGER;
- Err : INTEGER;
- Ctrl_Z_Written: BOOLEAN;
-
- BEGIN (* Handle_End_Pack *)
- (* Write any remaining characters *)
- (* in file buffer to file and *)
- (* close it. *)
- IF File_Open THEN
- BEGIN
- (* Add a Ctrl-Z to file if in *)
- (* text mode to mark end of file. *)
-
- IF ( Kermit_File_Type_Var = Kermit_Ascii ) THEN
- IF ( Buffer_Pos < Buffer_Size ) THEN
- BEGIN
- Buffer_Pos := Buffer_Pos + 1;
- Write_Buffer^[Buffer_Pos] := ORD( ^Z );
- Ctrl_Z_Written := TRUE;
- END
- ELSE
- Ctrl_Z_Written := FALSE;
-
- (* Write any remaining characters in *)
- (* buffer. *)
-
- Write_Count := Buffer_Pos;
-
- Err := Write_File_Handle( XFile_Handle, Write_Buffer^,
- Write_Count );
-
- (* Write a Ctrl-Z to file if in *)
- (* text mode and no room in buffer. *)
-
- IF ( Kermit_File_Type_Var = Kermit_Ascii ) AND
- ( NOT Ctrl_Z_Written ) THEN
- BEGIN
- Write_Buffer^[1] := ORD( ^Z );
- Write_Count := 1;
- Err := Write_File_Handle( XFile_Handle, Write_Buffer^,
- Write_Count );
- END;
-
- (* Close the file *)
-
- Err := Close_File_Handle( XFile_Handle );
-
- (* Mark file as closed. *)
- File_Open := FALSE;
-
- END;
- (* Acknowledge last record *)
- Send_ACK;
- (* And go back to waiting for *)
- (* start of next file. *)
-
- Kermit_State := Receive_Header;
-
- END (* Handle_End_Pack *);
-
- (*----------------------------------------------------------------------*)
- (* Handle_Break_Packet --- Handle break packet *)
- (*----------------------------------------------------------------------*)
-
- PROCEDURE Handle_Break_Pack;
-
- VAR
- Write_Count : INTEGER;
- Err : INTEGER;
- Ctrl_Z_Written: BOOLEAN;
-
- BEGIN (* Handle_Break_Pack *)
- (* Write any remaining characters *)
- (* in file buffer to file and *)
- (* close it. *)
- IF File_Open THEN
- BEGIN
- (* Add a Ctrl-Z to file if in *)
- (* text mode to mark end of file. *)
-
- IF ( Kermit_File_Type_Var = Kermit_Ascii ) THEN
- IF ( Buffer_Pos < Buffer_Size ) THEN
- BEGIN
- Buffer_Pos := Buffer_Pos + 1;
- Write_Buffer^[Buffer_Pos] := ORD( ^Z );
- Ctrl_Z_Written := TRUE;
- END
- ELSE
- Ctrl_Z_Written := FALSE;
-
- (* Write any remaining characters in *)
- (* buffer. *)
-
- Write_Count := Buffer_Pos;
-
- Err := Write_File_Handle( XFile_Handle, Write_Buffer^,
- Write_Count );
-
- (* Write a Ctrl-Z to file if in *)
- (* text mode and no room in buffer. *)
-
- IF ( Kermit_File_Type_Var = Kermit_Ascii ) AND
- ( NOT Ctrl_Z_Written ) THEN
- BEGIN
- Write_Buffer^[1] := ORD( ^Z );
- Write_Count := 1;
- Err := Write_File_Handle( XFile_Handle, Write_Buffer^,
- Write_Count );
- END;
-
- (* Close the file *)
-
- Err := Close_File_Handle( XFile_Handle );
-
- (* Mark file as closed. *)
- File_Open := FALSE;
-
- END;
- (* Acknowledge this packet *)
- Send_ACK;
- (* We're done with this batch of files. *)
- Receive_Done := TRUE;
-
- END (* Handle_Break_Pack *);
-
- (*----------------------------------------------------------------------*)
-
- BEGIN (* Kermit_Receive_File *)
- (* Loop over packets in file being *)
- (* received. *)
- REPEAT
- (* Get next packet *)
- Receive_Packet;
- (* Number of tries this packet *)
- Try := 0;
-
- CASE Packet_OK OF
- (* If packet bad *)
- FALSE : BEGIN
- Try := Try + 1;
- IF ( Try = Kermit_MaxTry ) THEN
- BEGIN
- Kermit_Abort := TRUE;
- Packet_Buffer := 'EToo many retries.';
- Build_Packet;
- Send_Packet;
- END
- ELSE
- Send_NAK;
- END;
- (* If packet OK *)
- TRUE : BEGIN
- IF ( Packet_Num = Rec_Packet_Num ) THEN
- Send_ACK
- ELSE
- BEGIN
-
- Packet_Num := Rec_Packet_Num;
-
- CASE Kermit_Packet_Type OF
- Data_Pack : Handle_Data_Pack;
- End_Pack : Handle_End_Pack;
- Break_Pack : Handle_Break_Pack;
- Header_Pack: ;
- Unknown : Send_NAK;
- ELSE
- Kermit_Abort := TRUE;
- END (* CASE *);
-
- END;
- END;
-
- END (* CASE *);
-
- UNTIL ( Kermit_Abort OR Receive_Done OR
- ( Kermit_Packet_Type = Header_Pack ) );
-
- END (* Kermit_Receive_File *);
-
- (*----------------------------------------------------------------------*)
-
- PROCEDURE Do_Kermit_Receive;
-
- BEGIN (* Do_Kermit_Receive *)
- (* Open display window for transfer *)
- Save_Screen( Local_Save );
-
- IF FileName <> '' THEN
- Menu_Title := 'Receive file ' + FileName + ' using Kermit'
- ELSE
- Menu_Title := 'Receive file using Kermit';
-
- Draw_Menu_Frame( 15, 10, 78, 21, Menu_Frame_Color,
- Menu_Text_Color, Menu_Title );
-
- Window( 16, 11, 77, 20 );
- (* Allocate buffer if requested *)
- (* otherwise use sector data area *)
- (* directly. *)
- IF Max_Write_Buffer > 1024 THEN
- BEGIN
- Buffer_Length := Max_Write_Buffer;
- Long_Buffer := TRUE;
- GetMem( Write_Buffer , Buffer_Length );
- END
- ELSE
- BEGIN
- Long_Buffer := FALSE;
- Write_Buffer := ADDR( Sector_Data );
- END;
-
- (* Initialize status display information *)
- Packets_Received := 0;
- Packets_Sent := 0;
- Packets_Bad := 0;
- Buffer_Num := 0.0;
- Receive_Done := FALSE;
- Kermit_MaxTry := 5;
- Kermit_Abort := FALSE;
- Kermit_Retry := FALSE;
- Buffer_Size := Buffer_Length;
- Quoting := FALSE;
- (* Initialize status display *)
- Initialize_Receive_Display;
- (* Choose reception method depending upon *)
- (* whether remote system in server mode *)
- (* or not. *)
-
- IF Kermit_Remote_Server THEN
- Kermit_State := Get_File
- ELSE
- Kermit_State := Receive_Init;
-
- (* Loop over received packets *)
- REPEAT
- (* Take action depending upon current *)
- (* Kermit state. *)
- CASE Kermit_State OF
-
- Get_File : Kermit_Get;
- Receive_Init : Kermit_Receive_Init;
- Receive_Header : Kermit_Receive_Header;
- Receive_File : Kermit_Receive_File;
-
- END (* CASE *);
-
- UNTIL ( Kermit_Abort OR Receive_Done );
-
- IF Receive_Done THEN
- Display_Kermit_Message('Completed.');
-
- DELAY( Two_Second_Delay );
- (* Remove download buffer *)
-
- IF Long_Buffer THEN
- FREEMEM( Write_Buffer , Buffer_Length );
-
- (* Remove Kermit window *)
- Restore_Screen( Local_Save );
-
- Reset_Global_Colors;
-
- END (* Do_Kermit_Receive *);
-
- (*----------------------------------------------------------------------*)
-
- PROCEDURE Get_File_Pattern;
-
- BEGIN (* Get_File_Pattern *)
-
- GoToXY( 2 , 8 );
-
- WRITE('File to receive: ');
-
- IF ( NOT Host_Mode ) THEN
- READLN( FileName )
- ELSE
- WRITELN( FileName );
-
- END (* Get_File_Pattern *);
-
- (*----------------------------------------------------------------------*)
-
- BEGIN (* Receive_Kermit_File *)
- (* Save screen *)
- Save_Screen( Local_Save_2 );
- (* Get Kermit menu *)
- WITH Kermit_Menu DO
- BEGIN
-
- Menu_Size := 6;
- Menu_Default := 1;
- Menu_Row := 11;
- Menu_Column := 20;
- Menu_Tcolor := Menu_Text_Color;
- Menu_Bcolor := BackGround_Color;
- Menu_Fcolor := Menu_Frame_Color;
- Menu_Width := 40;
- Menu_Height := 10;
-
- END (* WITH Kermit_Menu *);
-
- FOR I := 1 TO 6 DO
- WITH Kermit_Menu.Menu_Entries[I] DO
- BEGIN
- Menu_Item_Row := I;
- Menu_Item_Column := 2;
- CASE I OF
- 1: Menu_Item_Text := 'a) GET Text File';
- 2: Menu_Item_Text := 'b) GET Binary File';
- 3: Menu_Item_Text := 'c) RECEIVE Text File';
- 4: Menu_Item_Text := 'd) RECEIVE Binary File';
- 5: Menu_Item_Text := 'L) Logout Remote Server';
- 6: Menu_Item_Text := 'Q) Quit Kermit';
- END (* CASE *);
- END;
-
- Kermit_Menu.Menu_Title := 'Choose Kermit function: ';
- Kermit_Done := FALSE;
- Sending_File := FALSE;
- Host_Count := 0;
-
- REPEAT
- (* Reinitialize Kermit variables *)
- Kermit_Init;
- (* Display Kermit receive menu *)
- IF ( NOT Host_Mode ) THEN
- BEGIN
- Menu_Display_Choices( Kermit_Menu );
- Menu_Choice := Menu_Get_Choice( Kermit_Menu , Dont_Erase_Menu );
- END
- ELSE
- BEGIN
- Host_Count := Host_Count + 1;
- IF ( Host_Count = 1 ) THEN
- IF Kermit_File_Type_Var <> Kermit_Binary THEN
- Menu_Choice := 3
- ELSE
- Menu_Choice := 4
- ELSE
- Menu_Choice := 6;
- END;
- (* Perform desired Kermit function *)
-
- CASE Menu_Choice OF
-
- 1: BEGIN
- Kermit_File_Type_Var := Kermit_Ascii;
- Get_File_Pattern;
- Kermit_Remote_Server := TRUE;
- IF ( LENGTH( FileName ) > 0 ) THEN
- Do_Kermit_Receive;
- END;
-
- 2: BEGIN
- Kermit_File_Type_Var := Kermit_Binary;
- Get_File_Pattern;
- Kermit_Remote_Server := TRUE;
- IF ( LENGTH( FileName ) > 0 ) THEN
- Do_Kermit_Receive;
- END;
-
- 3: BEGIN
- Kermit_File_Type_Var := Kermit_Ascii;
- FileName := '';
- Kermit_Remote_Server := FALSE;
- Do_Kermit_Receive;
- END;
-
- 4: BEGIN
- Kermit_File_Type_Var := Kermit_Binary;
- FileName := '';
- Kermit_Remote_Server := FALSE;
- Do_Kermit_Receive;
- END;
-
- 5: Kermit_Finish_Server;
-
- 6: Kermit_Done := TRUE;
-
- END (* CASE *);
-
- UNTIL Kermit_Done;
-
- Restore_Screen( Local_Save_2 );
-
- Reset_Global_Colors;
-
- END (* Receive_Kermit_File *);